
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2010, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  ArcGIS layer class.
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Core/Layers/RasterLayerArcGIS.h"

#include "Minerva/Network/Http.h"

#include "Usul/Factory/RegisterCreator.h"
#include "Usul/Strings/Format.h"

using namespace Minerva::Core::Layers;

USUL_FACTORY_REGISTER_CREATOR ( RasterLayerArcGIS );


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

RasterLayerArcGIS::RasterLayerArcGIS() : BaseClass()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Copy Constructor.
//
///////////////////////////////////////////////////////////////////////////////

RasterLayerArcGIS::RasterLayerArcGIS ( const RasterLayerArcGIS& rhs ) : BaseClass ( rhs )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

RasterLayerArcGIS::~RasterLayerArcGIS()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Clone.
//
///////////////////////////////////////////////////////////////////////////////

Minerva::Core::Data::Feature* RasterLayerArcGIS::clone() const
{
  return new RasterLayerArcGIS ( *this );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the full url.
//
///////////////////////////////////////////////////////////////////////////////

std::string RasterLayerArcGIS::urlFull ( const TileKey& key, unsigned int width, unsigned int height ) const
{
  const std::string baseUrl ( this->urlBase() );
  return Usul::Strings::format ( baseUrl, "/tile/", key.level(), "/", key.row(), "/", key.column(), ".jpg" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Download image for tile.
//
///////////////////////////////////////////////////////////////////////////////

void RasterLayerArcGIS::_download ( const std::string& file, const TileKey& key, unsigned int width, unsigned int height, Usul::Jobs::Job *, IUnknown *caller )
{
  const std::string url ( this->urlFull ( key, width, height ) );
  Minerva::Network::Http::download ( url, file, 0 );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Cache as jpeg.
//
///////////////////////////////////////////////////////////////////////////////

std::string RasterLayerArcGIS::_cacheFileExtension() const
{
  return "jpg";
}
